" vim-plug {{
    " Specify a directory for plugins 
    call plug#begin('~/.config/nvim/plugged')
    Plug 'mhinz/vim-startify'
    Plug 'scrooloose/nerdcommenter'
    Plug 'Yggdroot/indentLine'
    "Plug 'jiangmiao/auto-pairs'
    Plug 'itchyny/vim-cursorword'
    Plug 'Chiel92/vim-autoformat'
    Plug 'voldikss/vim-floaterm'
    Plug 'neoclide/coc.nvim', {'branch': 'release'}
    Plug 'ryanoasis/vim-devicons'
    Plug 'luochen1990/rainbow'
    Plug 'theniceboy/vim-snippets'
    "Plug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' }   

    " Initialize plugin system
    call plug#end()
" }}

" Plugins Setting {{
    " floaterm {
        let g:floaterm_keymap_new    = '<leader>nf'
        let g:floaterm_keymap_prev   = '<leader>fp'
        let g:floaterm_keymap_next   = '<leader>fn'
        let g:floaterm_keymap_toggle = '<leader>ft' 

        nmap <leader>ra :FloatermNew ranger<CR>
    " }
    
    " lzaygit {
        nmap <leader>lg :tabe<CR>:-tabmove<CR>:term lazygit<CR>
    " }

    " startify_custom_header {
        " replace boxed to cowsay, to display the cow
        let g:startify_custom_header = 'startify#pad(startify#fortune#boxed())'
    " }

    " rainbow {
        let g:rainbow_active = 1
    " }
     
    " autoformat{
        au BufWrite *.py,*.html,*.js,*.css,*.go,*.json :Autoformat
    " }
    
    " coc.nvim {
        let g:coc_global_extensions = [
            \ 'coc-actions',
            \ 'coc-css',
            \ 'coc-emmet',
            \ 'coc-pairs',
            \ 'coc-diagnostic',
            \ 'coc-explorer',
            \ 'coc-html',
            \ 'coc-json',
            \ 'coc-stylelint',
            \ 'coc-lists',
            \ 'coc-prettier',
            \ 'coc-python',
            \ 'coc-marketplace',
            \ 'coc-snippets',
            \ 'coc-syntax',
            \ 'coc-tabnine',
            \ 'coc-translator',
            \ 'coc-tslint-plugin',
            \ 'coc-tsserver',
            \ 'coc-vimlsp',
            \ 'coc-yaml']
            "\ 'coc-yank']
            "\ 'coc-highlight',
            "\ 'coc-go',
        
            ""golang": {
              ""command": "gopls",
              ""rootPatterns": ["go.mod"],
              ""filetypes": ["go"],
              ""initializationOptions": {
                ""gocodeCompletionEnabled": true,
                ""diagnosticsEnabled": true,
                ""lintTool": "golint"
              ""}
            ""},
        autocmd FileType markdown let b:coc_pairs_disabled = ['`']
        " TextEdit might fail if hidden is not set.
        set hidden

        " some servers have issues with backup files, see #649.
        set nobackup
        set nowritebackup

        " Give more space for displaying messages.
        "set cmdheight=2

        " Having longer updatetime (default is 4000 ms = 4 s) leads to noticeable
        " delays and poor user experience.
        set updatetime=300

        " Don't pass messages to |ins-completion-menu|.
        set shortmess+=c

        nnoremap <c-c> :CocCommand<CR>

        " Always show the signcolumn, otherwise it would shift the text each time
        " diagnostics appear/become resolved.
        if has("patch-8.1.1564")
           "Recently vim can merge signcolumn and number column into one
            set signcolumn=number
        else
          set signcolumn=yes
        endif

        " Use tab for trigger completion with characters ahead and navigate.
        " NOTE: Use command ':verbose imap <tab>' to make sure tab is not mapped by
        " other plugin before putting this into your config.
        inoremap <silent><expr> <TAB>
              \ pumvisible() ? "\<C-n>" :
              \ <SID>check_back_space() ? "\<TAB>" :
              \ coc#refresh()
        inoremap <expr><S-TAB> pumvisible() ? "\<C-p>" : "\<C-h>"

        function! s:check_back_space() abort
          let col = col('.') - 1
          return !col || getline('.')[col - 1]  =~# '\s'
        endfunction

        " Use <c-space> to trigger completion.
        inoremap <silent><expr> <M-/> coc#refresh()

        " Make <CR> auto-select the first completion item and notify coc.nvim to
        " format on enter, <cr> could be remapped by other vim plugin
        inoremap <silent><expr> <cr> pumvisible() ? coc#_select_confirm()
                                      \: "\<C-g>u\<CR>\<c-r>=coc#on_enter()\<CR>"

        " Use `[g` and `]g` to navigate diagnostics
        " Use `:CocDiagnostics` to get all diagnostics of current buffer in location list.
        nnoremap <silent><nowait> <leader>d :CocList diagnostics<cr>
        "nmap <silent> <LEADER>- <Plug>(coc-diagnostic-prev)
        "nmap <silent> <LEADER>= <Plug>(coc-diagnostic-next)
        nmap <silent> [g <Plug>(coc-diagnostic-prev)
        nmap <silent> ]g <Plug>(coc-diagnostic-next)

        nmap tt :CocCommand explorer<CR>
        " coc-translator
        nmap ts <Plug>(coc-translator-p)

        " GoTo code navigation.
        nmap <silent> gd <Plug>(coc-definition)
        nmap <silent> gy <Plug>(coc-type-definition)
        nmap <silent> gi <Plug>(coc-implementation)
        nmap <silent> gr <Plug>(coc-references)

        " Use K to show documentation in preview window.
        nnoremap <silent> K :call <SID>show_documentation()<CR>

        function! s:show_documentation()
          if (index(['vim','help'], &filetype) >= 0)
            execute 'h '.expand('<cword>')
          else
            call CocActionAsync('doHover')
          endif
        endfunction

        " Highlight the symbol and its references when holding the cursor.
        "autocmd CursorHold * silent call CocActionAsync('highlight')

        " Symbol renaming.
        nmap <leader>rn <Plug>(coc-rename)

        augroup mygroup
          autocmd!
          " Setup formatexpr specified filetype(s).
          autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected')
          " Update signature help on jump placeholder.
          autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp')
        augroup end

        " coc-tasks
        noremap <silent> <leader>ts :CocList tasks<CR>
        " coc-snippets
        "imap <C-.> <Plug>(coc-snippets-expand)
        "vmap <C-,> <Plug>(coc-snippets-select)
        let g:coc_snippet_next = '<c-n>'
        let g:coc_snippet_prev = '<c-p>'
        "imap <C-,> <Plug>(coc-snippets-expand-jump)

        " Applying codeAction to the selected region.
        " Example: `<leader>aap` for current paragraph
        xmap <leader>a  <Plug>(coc-codeaction-selected)
        nmap <leader>a  <Plug>(coc-codeaction-selected)

        " Remap keys for applying codeAction to the current buffer.
        nmap <leader>ac  <Plug>(coc-codeaction)
        " Apply AutoFix to problem on the current line.
        nmap <leader>qf  <Plug>(coc-fix-current)

        " Map function and class text objects
        " NOTE: Requires 'textDocument.documentSymbol' support from the language server.
        "xmap if <Plug>(coc-funcobj-i)
        "omap if <Plug>(coc-funcobj-i)
        "xmap af <Plug>(coc-funcobj-a)
        "omap af <Plug>(coc-funcobj-a)
        "xmap ic <Plug>(coc-classobj-i)
        "omap ic <Plug>(coc-classobj-i)
        "xmap ac <Plug>(coc-classobj-a)
        "omap ac <Plug>(coc-classobj-a)

        " Use CTRL-S for selections ranges.
        " Requires 'textDocument/selectionRange' support of language server.
        "nmap <silent> <C-s> <Plug>(coc-range-select)
        "xmap <silent> <C-s> <Plug>(coc-range-select)

        " Add `:Format` command to format current buffer.
        command! -nargs=0 Format :call CocAction('format')

        " Add `:Fold` command to fold current buffer.
        command! -nargs=? Fold :call     CocAction('fold', <f-args>)

        " Add `:OR` command for organize imports of the current buffer.
        command! -nargs=0 OR   :call     CocAction('runCommand', 'editor.action.organizeImport')

        " Add (Neo)Vim's native statusline support.
        " NOTE: Please see `:h coc-status` for integrations with external plugins that
        " provide custom statusline: lightline.vim, vim-airline.
        set statusline^=%{coc#status()}%{get(b:,'coc_current_function','')}

        " Mappings for CoCList
        " Show all diagnostics.
        nnoremap <silent><nowait> <space>a  :<C-u>CocList diagnostics<cr>
        " Manage extensions.
        nnoremap <silent><nowait> <space>e  :<C-u>CocList extensions<cr>
        " Show commands.
        nnoremap <silent><nowait> <space>c  :<C-u>CocList commands<cr>
        " Find symbol of current document.
        nnoremap <silent><nowait> <space>o  :<C-u>CocList outline<cr>
        " Search workspace symbols.
        nnoremap <silent><nowait> <space>s  :<C-u>CocList -I symbols<cr>
        " Do default action for next item.
        nnoremap <silent><nowait> <space>j  :<C-u>CocNext<CR>
        " Do default action for previous item.
        nnoremap <silent><nowait> <space>k  :<C-u>CocPrev<CR>
        " Resume latest coc list.
        nnoremap <silent><nowait> <space>p  :<C-u>CocListResume<CR>
    " }
" }}
